#ifndef HEAP_H
#define HEAP_H

#include "bool.h"
#include "arista.h"

typedef tarista halpha;
typedef struct sheap *heap;

/* Constructor del TAD */
heap create_heap(const size_t size);

/* Añadir elemento al Heap */
void add_heap(heap h, halpha e);

/* Retorna el primer elemento del Heap */
halpha top_heap(heap h);

/* Quita el primer elemento del Heap */
void heap_pop(heap h);

/* Su estado es 1 si el Heap se encuentra vacío */
Bool heap_vacio(heap h);

/* Su estado es 1 si el Heap se encuentra lleno */
Bool heap_lleno(heap h);

/* Retorna y elminina un elemento del Heap */
halpha heap_saca(heap h);

/* Retorna el tamaño actual del Heap */
int tam_heap(heap h);

/* Destructor del TAD */
heap heap_destroy(heap h);

/* Prototipos de funciones secundarias */
void sink(heap h,int i);
void flotar(heap h,int i);
void lift(heap h,int i);
Bool must_lift(heap h,int i);
int father(int i);
int left_child(int i);
int right_child(int i);
Bool has_father(int t);
Bool has_child(heap h,int t);
Bool has_children(heap h,int t);
int min_child(heap h,int t);

#endif /* HEAP_H */
